#pragma once

#ifndef ConponentMeshParser_hpp
#define ConponentMeshParser_hpp

#include<string>
#include<cstdint>
#include<vector>
#include<map>
#include"../Framework/DataTypeDef.hpp"


namespace MMF
{
    /**
     * 装备中组件网络的中一个组件的信息
    */
    struct ConponentMeshInfo
    {
        std::string mName;               ///< 组件要使用的名字，这个名字在这个装备中必须是唯一的
        std::string mDeviceName;         ///< 本组件要使用的设备抽象层名字
        int32_t mCanvasX;                ///< 此组件画布中图标的x坐标
        int32_t mCanvasY;                ///< 此组件画布中图标的x坐标
        int32_t width;                   ///< 在画布中的宽
        int32_t height;                  ///< 在画布中的高
        bool mSentData;                  ///< 是否推送本组件向网络中发送的数据
        bool mRecvData;                  ///< 是否是一个用于接受网络中其他此类组件的数据
    };

    /**
     * 装备中组件网络的中一个链接的详细信息
    */
    struct ConponentConnectionInfo
    {
        std::string mStartCompName;                     ///< 链接的起始组件
        std::string mEndComName;                        ///< 链接的终点组件
        uint32_t mStartOutPortIdx;                      ///< 链接起始组件的输出口索引号
        uint32_t mEndInPortIdx;                         ///< 链接终点组件的输入口索引号
        std::vector<MMF::Point<int32_t>> mPoints;       ///< 链接绘制时的所有点
    };

    /**
     * 他特定装备的显控界面的动态库数据
    */
    struct UIComponentInfo
    {
        std::string mDllPath;
        std::string mCreateFunc;
    };

    class ConponentMeshParser
    {

        std::string mMeshFilePath;      ///< 装备配置文件路径
        std::string mMeshName;          ///< 装备名字
        int32_t mCanvasWidth;           ///< 编辑器画布宽
        int32_t mCanvasHeight;          ///< 编辑器画布高

        UIComponentInfo mComponentInfo; ///< 动态库路径

        std::map<std::string, ConponentMeshInfo> mComponents;           ///< 装备中所有的组件
        std::vector<ConponentConnectionInfo> mConnections;              ///< 组件的所有链接

    private:

        /**
         * 解析配置文件中的内容
        */
        bool Parse();

        /**
         * 生成配置文件
        */
        bool Pack();

    public:

        /**
         * 构造函数
         * 设置一个装备配置的文件路径
        */
        ConponentMeshParser(const std::string& filePath, bool IsCreate = false);

        /**
         * 析造函数
         * 目前没有用到
        */
        ~ConponentMeshParser() {}

        /**
         * 获取配置文件路径
        */
        const std::string& MeshFilePath();

        /**
         * 获取装备名字
        */
        const std::string& MeshName();

        /**
         * 获取画布宽
        */
        int32_t CanvasWidth();

        /**
         * 获取画布高
        */
        int32_t CanvasHeight();

        /**
         * 返回解析出来的动态库信息
        */
        bool GetUIComponentInfo(UIComponentInfo* &info);

        /**
         * 获取所有的组件
        */
        const std::map<std::string, ConponentMeshInfo>& ComponentInfos();

        /**
         * 获取某个组件
        */
        const ConponentMeshInfo& ComponentInfo(const std::string& name);

        /**
         * 获取所有链接
        */
        const std::vector<ConponentConnectionInfo>& ConnectionInfos();

        /**
         * 添加一个组件的信息
        */
        bool AddComponentInfo(const ConponentMeshInfo& info);

        /**
         * 删除一个组件的信息
        */
        bool DeleteComponentInfo(const std::string& name);

        /**
         * 添加一个链接
        */
        bool AddConnection(const ConponentConnectionInfo& cntInfo);

        /**
         * 删除一个链接
        */
        bool DeleteConnection(const ConponentConnectionInfo& cntInfo);

        /**
         * 保存配置文件
        */
        bool Save();
    };
}

#endif